home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 292_03 / mond09.asm < prev    next >
Assembly Source File  |  1990-07-16  |  55KB  |  2,290 lines

  1.     .title    MONDEB - 09
  2.  
  3.     ;    *********************************************************
  4.     ;    *                            *
  5.     ;    *    MONDEB - 09  -  a monitor/debugger        *
  6.     ;    *        for the 6809  microprocessor        *
  7.     ;    *                            *
  8.     ;    *********************************************************
  9.     ;
  10.     ; author:    Don Peters    (6800 version)
  11.     ; date:        April 1977
  12.     ;
  13.     ; modified for the 6809
  14.     ; by:        Alan R. Baldwin
  15.     ; date:        Nov 1988    
  16.     ;
  17.     ;      This 6809 monitor/debugger does not use the
  18.     ;    direct page addressing mode.  Thus the user
  19.     ;    program has complete control of the page
  20.     ;    assignment and may use the monitor routines
  21.     ;    without concern for variable locations.
  22.     ;
  23.     ;      To add user functions to MONDEB - 09
  24.     ;
  25.     ;    1) add your commands to the end of command list #1
  26.     ;    2) add the command entry points to the jump table
  27.     ;    3) append any local command lists after MONDEB's
  28.     ;    4) provide an external initialization routine to
  29.     ;        set up the console (and/or alternate)
  30.     ;        ports and any other start up processing.
  31.     ;       MONDEB will call 'userinit' if inituser = 1.
  32.     ;
  33.  
  34.     .module    mond09
  35.  
  36.     standalone = 0    ; standalone flag indicating the
  37.             ; vectors and associated code are
  38.             ; to be included during assembly
  39.  
  40.     inituser = 0    ; call 'userinit' flag indicating
  41.             ; a user startup routine will be
  42.             ; called during intialization
  43.  
  44.     .page
  45.     .sbttl    MONDEB - 09 working variables
  46.  
  47.     .radix    d
  48.  
  49.     .if    standalone
  50.  
  51.     .area    WORKPG    (REL,CON)
  52.  
  53.     .else
  54.  
  55.     .area    WORKPG    (ABS,OVR)
  56.  
  57.     .endif
  58.  
  59.     .setdp    0
  60.  
  61. workpg:    .blkb    256-(endpg-mstack)
  62.             ; main stack storage
  63. mstack:    .blkb    12    ; stack storage for rti instruction
  64.  
  65. ttybuf:    .blkb    72    ; start of input line buffer
  66. ttyend:    .blkb    1    ; end of input line buffer
  67. bufbeg:    .blkb    2    ; input line start of buffer
  68. bufend:    .blkb    2    ; input line end of buffer
  69.  
  70. comadr:    .blkb    2    ; address of beginning of command lists
  71. synptr:    .blkb    2    ; input line character pointer for good syntax
  72. linptr:    .blkb    2    ; input line character pointer (content =>
  73.             ; content of synptr)
  74. bolflg:    .blkb    1    ; "beginning of line flg"
  75. delim:    .blkb    1    ; characters permitted as valid command/modifier
  76.             ; delimiter
  77. ibcode:    .blkb    1    ; input base (1=hex, 2=dec, 3=oct)
  78. dbcode:    .blkb    1    ; display base (1=hex, 2=dec, 3=oct, 4=bin)
  79. dbnbr:    .blkb    1    ; display base number (e.g., 16,10,8, or 2)
  80. nbrhi:    .blkb    1    ; most significant byte of scanned number
  81. nbrlo:    .blkb    1    ; least significant byte of scanned number
  82. ranglo:    .blkb    2    ; range lower limit picked up by gtrang
  83. ranghi:    .blkb    2    ; range upper limit picked up by gtrang
  84. verfrm:    .blkb    2    ; beginning address of range to verify
  85. verto:    .blkb    2    ; ending address of range to checksum verify
  86. chksum:    .blkb    1    ; checksum of range given in the verify command
  87. brkadr: .blkb    2    ; address of inserted breakpoint
  88. brkins:    .blkb    1    ; instruction which should be there normally
  89. inpflg:    .blkb    1    ; alternate input flag
  90. outflg:    .blkb    1    ; alternate output flag
  91. outadr:    .blkb    2    ; alternate address that the output chars go to
  92. hdxflg:    .blkb    1    ; half-duplex terminal flag (if non-zero, no echo)
  93. cplcnt:    .blkb    1    ; "characters per line" count
  94. cplmax:    .blkb    1    ; "characters per line" maximum
  95.  
  96.     ; temporary (locally used) variables
  97.  
  98. temp1:    .blkb    2    ; in: main
  99. temp2:    .blkb    2    ; in: main
  100. temp3:    .blkb    2    ; in: main
  101. temp4:    .blkb    2    ; in: main
  102. temp5:    .blkb    2    ; in: main
  103. temp6:    .blkb    2    ; in: main
  104.  
  105. nummat:    .blkb    1    ; used in command
  106. lisnum:    .blkb    1    ; used in command
  107. comnum:    .blkb    1    ; used in command
  108. lisptr:    .blkb    2    ; used in command
  109. decdig:    .blkb    1    ; decimal digit being built
  110. numbhi:    .blkb    1    ; used by outnum
  111. numblo:    .blkb    1    ; used by outnum
  112. nbr2x:    .blkb    2    ; used by number
  113. timcon:    .blkb    2    ; delay time constant
  114. bytect:    .blkb    1    ; record byte count used in load command
  115. cksm:    .blkb    1    ; record checksum used in load command
  116.  
  117. conin:    .blkb    2    ; address of console input routine
  118. conout:    .blkb    2    ; address of console output routine
  119. altin:    .blkb    2    ; address of alternate input routine
  120. altout:    .blkb    2    ; address of alternate output routine
  121.  
  122. .rsrvd:    .blkb    2    ; reserved vector
  123. .swi3:    .blkb    2    ; swi3 vector
  124. .swi2:    .blkb    2    ; swi2 vector
  125. .firq:    .blkb    2    ; firq vector
  126. .irq:    .blkb    2    ; irq vector
  127. .swi:    .blkb    2    ; swi vector
  128. .nmi:    .blkb    2    ; nmi vector
  129. spsave:    .blkb    2    ; saved stack pointer
  130. endpg:
  131.  
  132.     ; convenient equivalences for local variables
  133.  
  134. memadr    =    temp1    ; display, set, search, test
  135. strnum    =    temp2    ; fndstr
  136. eoschr    =    temp2+1    ; fndstr
  137.  
  138.     ; for "search" command
  139.  
  140. bytptr    =    temp2
  141. nbytes    =    temp3
  142. nbrmat    =    temp3+1
  143. bytstr    =    temp4
  144.  
  145.     ; other constants
  146.  
  147. cr    =    13    ; carriage return
  148. lf    =    10    ; line feed
  149.  
  150.  
  151.     .page
  152.     .sbttl    MOND09 Startup
  153.  
  154.     .if    standalone
  155.  
  156.     .area    MONDEB    (REL,CON)
  157.  
  158. reset:    lds    #mstack+12    ; load stack pointer
  159.     bsr    mond09        ; stack pc and start mondeb
  160.     bra    reset
  161.     .else
  162.  
  163.     .area    MONDEB    (ABS,OVR)
  164.  
  165.     .endif
  166.  
  167. mond09:    pshs    u,y,x,dp,b,a,cc    ; pseudo swi
  168.     sts    spsave        ; save the pointer
  169.     orcc    #0b01010000    ; hold irq and firq interrupts
  170.     lds    #mstack        ; initialize the stack pointer
  171.     jsr    inital        ; initialize variables
  172.     jsr    docrlf        ; advance to a clean line
  173.     ldx    #msghed        ; get address of header
  174.     jsr    outstr        ; type it
  175.     ldx    #ttybuf-1    ; get address of terminal input buffer
  176.     stx    bufbeg        ; save it
  177.     ldx    #ttyend        ; define end of input buffer
  178.     stx    bufend        ; 72 char capacity, incl cr
  179.     lda    #3        ; delimiter class definition
  180.     sta     delim        ; space or comma (code 3)
  181.     bra    promp1
  182.  
  183.     ; prepare to get a new command
  184.  
  185. prompt:    jsr    docrlf    ; type cr-lf
  186.     inc    bolflg    ; set 'beginning of line' flag
  187.     ldx     synptr    ; point to current character
  188.     lda    ,x    ; get it
  189.     cmpa    #';    ; semicolon?
  190.     beq    getcmd    ; continue scan if it is, 
  191.             ; skipping the prompt
  192. promp1:    ldx    #msgprm    ; type prompt
  193.     jsr    outstr
  194.     jsr    getlin    ; get line of input
  195.     cmpb    #3    ; abort line on a control-c
  196.     beq    prompt
  197.  
  198.     ldx    bufbeg    ; set syntax scanning pointer
  199.     stx    synptr    ; to beginning of buffer/line
  200.     lda    1,x    ; get first char
  201.     jsr    tsteol    ; reprompt on an empty line
  202.     beq    prompt    ; (first char = cr,lf,or ;)
  203.  
  204.     .page
  205.     .sbttl    Get Command
  206.  
  207. getcmd:    lda    #1    ; use list 1 when matching
  208.     jsr    comand    ; now go for a match
  209.     beq    prompt    ; reprompt if just a cr was typed
  210.     bgt    jmpcmd    ; good command if positive    
  211.  
  212. badsyn: ldx    bufbeg    ; get start of line
  213.  
  214. 1$:    cpx    linptr    ; space over to the error in syntax
  215.     beq    2$    ; at error ?
  216.     jsr     outsp    ; output a space
  217.     inx        ; no, move on
  218.     bra    1$
  219.  
  220.     ; the 'extra' char '1' is compensated for by the prompt
  221.     ; char on the preceeding line
  222.  
  223. 2$:    lda    #'^    ; at error - get an up-arrow
  224.     jsr    outchr    ; print it
  225.     jsr    docrlf
  226.     bra    promp1    ; ignore any succeeding packed
  227.             ; commands
  228.  
  229.     ; *******
  230.     ; *there should be no more characters on the input line
  231.     ;    (except delimiters)
  232.  
  233. nomore:    jsr    skpdlm
  234.     bcs    prompt    ; if carry bit set, end of line
  235.             ; (normal)
  236.     bra    badsyn    ; there is something there but shouldn't be
  237.  
  238.     .page
  239.     .sbttl    Command Dispatcher
  240.  
  241.     ; ******
  242.     ; execute a computed 'goto' to the proper command
  243.  
  244. jmpcmd:    asla        ; multiply command by 2
  245.     ldx    #1$-2
  246.     jmp    [a,x]    ; jump to designated command
  247.  
  248. 1$:    .word    break
  249.     .word    contin
  250.     .word    compar
  251.     .word    copy
  252.     .word    displa
  253.     .word    dbase
  254.     .word    delay
  255.     .word    dump
  256.     .word    goto
  257.     .word    help
  258.     .word    ibase
  259.     .word    load
  260.     .word    reg
  261.     .word    set
  262.     .word    search
  263.     .word    test
  264.     .word    verify
  265.     .word    cli
  266.     .word    clf
  267.     .word    sei
  268.     .word    sef
  269.     .word    xirq
  270.     .word    xfirq
  271.     .word    xnmi
  272.     .word    xrsrvd
  273.     .word    xswi
  274.     .word    xswi2
  275.     .word    xswi3
  276.  
  277.     .page
  278.     .sbttl    REG - display registers
  279.  
  280. reg:            ; print stack stored swi data
  281. disreg:    ldx    spsave    ; get saved stack pointer
  282.     clr    comnum    ; start at beginning of the
  283.             ; register name list
  284.     bsr    1$    ; type condition codes
  285.     bsr    1$    ; type acca
  286.     bsr    1$    ; type accb
  287.     bsr    1$    ; type dp
  288.     jsr    docrlf    ; advance to a clean line
  289.     bsr    2$    ; type index reg x
  290.     bsr    2$    ; type index reg y
  291.     bsr    2$    ; type index reg u
  292.     jsr    docrlf    ; advance to a clean line
  293.     leax    -9,x    ; back to d
  294.     bsr    2$    ; type d
  295.     leax    7,x    ; back to pc
  296.     bsr    2$    ; type program counter
  297.  
  298.     ; type the stack pointer location
  299.  
  300.     bsr    3$    ; type stack pointer id
  301.     ldx    #spsave
  302.     jsr    out2by    ; type the value
  303.     jmp    nomore
  304.  
  305.     ; output content of a 1 byte register
  306.  
  307. 1$:    bsr    3$
  308.     jsr    out1by
  309.     inx
  310.     rts
  311.  
  312.     ; output content of a 2 byte register
  313.  
  314. 2$:    bsr    3$
  315.     jsr    ou